import router from '@/router'
import store from '@/store'
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'
import { getToken } from '@/utils/auth'
import { asyncRoutes } from '@/router/asyncRoutes'
// import { assignRoles } from './api/employees'
// 权限控制
// 应用启动的时候 权限控制就立即生效
// main.js 初始化的事情 立即执行一下 permission.js

// 模块化  export  import  直接导入js  会被立刻执行
// console.log('权限文件被执行了')

// 创建白名单
const WHITELST = ['/login', '/404']

// 路由前置守卫
router.beforeEach(async(to, from, next) => {
  // 跳转前开启进度条 第三方插件
  NProgress.start()
  // to: 跳转到的目标路由对象
  // from: 来源路由对象
  // next:放行函数 可执行的函数
  const token = getToken()
  if (token) {
    // 有 token
    if (to.path === '/login') {
      next('/')
    } else {
      next()
      if (!store.state.user.userInfo.userId) {
        const res = await store.dispatch('user/fetchUserInfo')
        // 权限控制
        // 1. 拿到当前用户的menus权限数据 以及 所有的动态路由表
        const menus = res.menus
        // 2. 以menus为主对asyncRoutes做过滤 [filter] 找到符合条件的项 [路由的name能否在menus中找到 找得到就是符合条件
        console.log(menus, asyncRoutes)
        const filterMenus = asyncRoutes.filter((route) => menus.includes(route.children[0].name))
        console.log(filterMenus)
        // 3. 动态添加路由 把筛选出来有资格的路由添加到路由系统中
        // 让访问path的时候可以渲染组件
        router.addRoutes(filterMenus)
        // 4. 提交动态路由数据交给菜单
        store.commit('menu/setMenuList', filterMenus)
      }
    }
  } else {
    // 没有 token
    // 判断是不是在白名单里
    // 白名单：当前的路由不需要加控制 直接放行就行
    if (WHITELST.includes(to.path)) {
      next()
    } else {
      next('/login')
    }
  }

  // 跳转结束，关闭进度条
  NProgress.done()
})
